<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 一个经典题目：
    // 2[1[a]3[abc]] ----> aabcabcabcaabcabcabc
    // 3[2[a]2[b]]   ----> aabbaabbaabb
    // function isChar(single) {
    //   const no = single.charCodeAt()
    //   return (no <= 122 && no >= 97) || (no >= 65 && no <= 98)
    // }
    // function convert(str) {
    //   let stk = []
    //   let ret = ''
    //   for (let i = 0, len = str.length, temp = ''; i < len; ++i) {
    //     if (str[i] == '[') {
    //       stk.push(str[i-1])
    //     } else if (str[i] == ']') {
    //       let times = stk.pop() - '0'
    //       ret += temp.repeat(times)
    //     } else if (isChar(str[i])) {
    //       temp += str[i]
    //     } else {
    //       temp = ''
    //     }
    //   }
    //   return ret
    // }

    function smartRepeat(tempstr) {
      let idx = 0
      let numstk = [], chstk = []
      let rest = tempstr

      while (idx < tempstr.length - 1) {
        rest = tempstr.substr(idx)
        if (/^\d+\[/.test(rest)) {
          // 剩下的字符串以数字开头
          let times = rest.match(/^(\d+)\[/)[1]

          // 1、数字压栈
          numstk.push(times - 0)

          // 2、空字符串压栈
          chstk.push('')

          // 3、指针后移 数字长度 + 1 位
          idx += times.length + 1
        } else if (/^\w+\]/.test(rest)) {
          // console.log(rest)
          // 拿到字母
          let wd = rest.match(/^(\w+)\]/)[1]

          // 将栈顶的单词改写成 wd
          chstk[chstk.length - 1] = wd
          
          // 指针后移
          idx += wd.length 
        } else if (rest[0] == ']'){
          // 字符是 ] ，两栈弹出，和栈顶拼接好，入栈到字符栈
          let t = numstk.pop(), ch = chstk.pop()
          chstk[chstk.length - 1] += ch.repeat(t)
          ++idx
        } else {
          ++idx
        }
      }

      // while 结束，字符栈最后肯定还剩一项
      return chstk[0].repeat(numstk[0])
    }

    console.log(smartRepeat('2[1[a]3[abc]]'))
  </script>
</body>
</html>